/*
 * WH-GM5 4G模块
 */

#ifndef WHGM5_H_
#define WHGM5_H_

#include "driverlib\MSP430F5xx_6xx\driverlib.h"
#include <string.h>
#include <stdio.h>

/*
 * 引脚定义
 */
#define WHGM5_USCI_PORT                     GPIO_PORT_P5
#define WHGM5_USCI_PIN_TX                   GPIO_PIN6//p5.6
#define WHGM5_USCI_PIN_RX                   GPIO_PIN7//p5.7
#define WHGM5_USCI_BASE                     USCI_A1_BASE //模块基地址，P56和P57使用的是USCI_A1


/*
 * 结构体
 */
#define WHGM5_RxBuffer_Length  32
#define WHGM5_RxParameter_Length  8

uint8_t WHGM5_RxBuffer[WHGM5_RxBuffer_Length];
uint8_t WHGM5_RxBufferCount;

/*
 * @brief  初始化WH-GM5的串口通讯
 * @param  详见函数WHGM5_setSock()说明。
 * @retval 无
 */
void WHGM5_Init(uint8_t sock,uint8_t protocol,uint8_t *ipAdress,uint8_t *port);

/*
 * @brief  发送AT指令初始化WH-GM5模块
 * @param  详见函数WHGM5_setSock()说明。
 * @retval 无
 */
void WHGM5_ConfigModule(uint8_t sock,uint8_t protocol,uint8_t *ipAdress,uint8_t *port);

///*
// * @brief  清空/初始化结构体
// * @param  无
// * @retval 无
// */
//void WHGM5_ClrStruct();

/*
 * @brief  解析从4G模块接收到的数据，如果没有接收到新的数据，则函数自动跳过
 * @param  无
 * @retval  0：没有新数据
 *         -1：校验和不匹配
 *          1：接收到了新数据并解析完成
 */
int8_t WHGM5_parse4GBuffer(uint8_t *RxCommand,uint8_t *RxParameter,uint8_t *RxParameterCount);

/*
 * @brief  输入index判断是否超出队列RxBuffer的缓存空间，并返回正确的值
 * @param  无
 * @retval 返回正确的index
 */
uint8_t WHGM5_getQueueIndex(uint8_t index);

/*
 * @brief  发送末尾为0x00的字符串
 * @param  str：要发送的字符串
 * @retval 无*/
void WHGM5_sendStr(uint8_t *str);

/*
 * @brief  发送没办法使用0x00判断末尾的字符串
 * @param  str：要发送的字符串
 *         len：字符串的长度
 * @retval 无*/
void WHGM5_sendStrLen(uint8_t *str,uint16_t len);

/*
 * @brief  将数字转换成字符并发送
 * @param  num：要发送的数字
 * @retval 无
 */
void WHGM5_sendNum8(uint8_t num);
void WHGM5_sendNum16(uint16_t num);

/*
 * @brief  等待有新数据接收，需要在函数前运行这个，以确保当前指向的内存位“空”
 *                          currentCount = WHGM5_Data.RxBufferCount;
 *                          WHGM5_Data.RxBuffer[currentCount] = 0;
 * @param  currentCount:当前RxBuff计数
 *         Timeing:等待时间，每单位是0.1秒
 * @retval  0:等待完毕
 *         -1：等待超时 */
int8_t WHGM5_waitRx(uint16_t currentCount, uint8_t Timeing);

///*
// * @brief  打开4G模块的电源
// * @param  无
// * @retval 无
// */
//void WHGM5_powerON();
//
///*
// * @brief  关闭4G模块的电源
// * @param  无
// * @retval 无 */
//void WHGM5_powerOFF();

/*
 * @brief  设置4G模块套接字的参数
 * @param  sock:    选择要配置的套接字A、B、C或D
 *         protocol：通讯协议，1：UDP，非1：TCP
 *         ipAdress：服务器IP地址
 *         port：            服务器端口
 * @retval 无 */
void WHGM5_setSock(uint8_t sock,uint8_t protocol,uint8_t *ipAdress,uint8_t *port);

/*
 * @brief  发送握手指令
 * @param  无
 * @retval 无 */
void WHGM5_sendHandshakeCmd(uint8_t *pmsp430_ID);

#endif /* WHGM5_H_ */
